package com.dkd.system.utils;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class CodeGenerator {

    public static void main(String[] args) {
        // 示例1：生成编码
        String code = CodeGenerator.generateCode("ZLDL", "yyyyMMdd", 2, 1);
        System.out.println(code); // 输出类似：ORD20230815-005

        // 示例2：获取下一个序号
        int nextSeq = CodeGenerator.getNextSequence(5, 3, 0, new Date());
        System.out.println(nextSeq); // 输出：6

        // 示例3：带重置逻辑的序号获取
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DAY_OF_MONTH, -1); // 昨天
        Date yesterday = cal.getTime();

        int nextSeqWithReset = CodeGenerator.getNextSequence(5, 3, 1, yesterday);
        System.out.println(nextSeqWithReset); // 如果是新的一天，输出：1
    }
    
    /**
     * 生成编码
     * @param prefix 编码前缀
     * @param dateFormat 日期格式（如yyyyMMdd）
     * @param seqLength 序号长度（如2表示01-99，3表示001-999）
     * @param currentValue 当前序号值
     * @return 生成的完整编码
     */
    public static String generateCode(String prefix, String dateFormat, int seqLength, int currentValue) {

        // 1. 校验参数
        //前缀可以为空，不做校验。
//        if (prefix == null || prefix.isEmpty()) {
//            throw new IllegalArgumentException("编码前缀不能为空");
//        }
        if (dateFormat == null || dateFormat.isEmpty()) {
            throw new IllegalArgumentException("日期格式不能为空");
        }
        if (seqLength <= 0) {
            throw new IllegalArgumentException("序号长度必须大于0");
        }
        if (currentValue < 0) {
            throw new IllegalArgumentException("当前序号值不能为负数");
        }

        // 2. 生成日期部分
        String datePart = new SimpleDateFormat(dateFormat).format(new Date());
        
        // 3. 生成序号部分（自动补零）
        String seqFormat = "%0" + seqLength + "d";
        String seqPart = String.format(seqFormat, currentValue);
        
        // 4. 检查序号是否超出范围
        int maxSeq = (int) Math.pow(10, seqLength) - 1;
        if (currentValue > maxSeq) {
            throw new IllegalArgumentException("当前序号值超过最大允许值" + maxSeq);
        }
        
        // 5. 组合各部分生成完整编码
        return prefix + datePart + "-" + seqPart;
    }
    
    /**
     * 获取下一个序号值
     * @param currentValue 当前序号值
     * @param seqLength 序号长度
     * @param resetType 重置类型（0不重置，1按天，2按月，3按年）
     * @param lastGenerateDate 上次生成日期
     * @return 下一个序号值
     */
    public static int getNextSequence(int currentValue, int seqLength, int resetType, Date lastGenerateDate) {
//        // 检查是否需要重置序号
//        if (shouldResetSequence(resetType, lastGenerateDate)) {
//            return 1; // 重置后从1开始
//        }
        // 检查是否达到最大值
        int maxSeq = (int) Math.pow(10, seqLength) - 1;
        if (currentValue >= maxSeq) {
            throw new IllegalStateException("序号已达到最大值" + maxSeq + "，无法继续生成");
        }
        
        return currentValue + 1;
    }
    
    /**
     * 判断是否需要重置序号
     */
    private static boolean shouldResetSequence(int resetType, Date lastGenerateDate) {
        if (lastGenerateDate == null) {
            return false;
        }
        
        Date now = new Date();
        SimpleDateFormat sdf;
        
        switch (resetType) {
            case 1: // 按天重置
                sdf = new SimpleDateFormat("yyyyMMdd");
                return !sdf.format(lastGenerateDate).equals(sdf.format(now));
            case 2: // 按月重置
                sdf = new SimpleDateFormat("yyyyMM");
                return !sdf.format(lastGenerateDate).equals(sdf.format(now));
            case 3: // 按年重置
                sdf = new SimpleDateFormat("yyyy");
                return !sdf.format(lastGenerateDate).equals(sdf.format(now));
            default: // 不重置
                return false;
        }
    }


}